/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CiaAerea;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.InputMismatchException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
/**
 *
 * @author André
 */
public class Aeronave {
    
    private String prefixoIdentificador;
    private String modelo;
    private int autonomia;
    private int numTotalFileiras;
    private int numAssentosPorFileira;
    private int numFileirasExecutiva;
    private int numFileirasEconomica;
    private String dataDisponivel;
    private String horaDisponivel;

    public String getDataDisponivel() {
        return dataDisponivel;
    }

    public void setDataDisponivel(String dataDisponivel) throws Exception {
        
        
        this.dataDisponivel = dataDisponivel;    
        
        
    }

    public String getHoraDisponivel() {
        return horaDisponivel;
    }

    public void setHoraDisponivel(String horaDisponivel) throws Exception {
        this.horaDisponivel = horaDisponivel;
    }
    

    public ArrayList<Voo> getAvooAeronave() {
        return AvooAeronave;
    }

    public void setAvooAeronave(ArrayList<Voo> AvooAeronave) {
        this.AvooAeronave = AvooAeronave;
    }

    public Hashtable<Integer, Voo> getHvooAeronave() {
        return HvooAeronave;
    }

    public void setHvooAeronave(Hashtable<Integer, Voo> HvooAeronave) {
        this.HvooAeronave = HvooAeronave;
    }
    
    private ArrayList<Voo> AvooAeronave = new ArrayList<Voo>();
    private Hashtable<Integer, Voo> HvooAeronave = new Hashtable<Integer,Voo>();
    
    public Aeronave()
    {
        
    }

    public Aeronave(String prefixoIdentificador, String modelo, int autonomia,
            int numTotalFileiras, int numAssentosPorFileira, int numFileirasExecutiva, int numFileirasEconomica) throws Exception{
        
        
        
    }
    
    public Voo getvooAeronave(int cod){
        return HvooAeronave.get(cod);
    }
    
    public ArrayList<Voo> getAllVoo(){
        
        return AvooAeronave;
    }
    
    public void setvooAeronave(Voo nave){
        AvooAeronave.add(nave);
        HvooAeronave.put(nave.getCodigoIdentificador(), nave);
    }
    
    public String getPrefixoIdentificador() {
        return prefixoIdentificador;
    }

    public void setPrefixoIdentificador(String prefixoIdentificador) throws Exception {
        
       if(prefixoIdentificador.isEmpty())
       {
           throw new Exception("Campo Prefixo nulo! Digite novamente.");
       }
       else
       {
           this.prefixoIdentificador = prefixoIdentificador; 
       }
          
        
 
       
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) throws Exception {
        
        if(modelo.isEmpty())
        {
            throw new Exception("Campo Modelo Vazio !");
            
        }
        else
        {
            for (int i = 0; i < modelo.length(); i++) {
                if (!Character.isLetterOrDigit(modelo.charAt(i)) && !Character.isSpaceChar(modelo.charAt(i))) {
                    throw new Exception("Caractere Invalido no campo Nome");
                } else {
                    this.modelo = modelo;
                }
            
           this.modelo = modelo;
            }
        }
       
    }

    public int getAutonomia() {
        return autonomia;
    }

    public void setAutonomia(int autonomia) throws Exception {
       
     
        
        if(autonomia<=0)
        {
            
            throw new Exception("Autonomia nula! Digite novamente.");
        }
        else
        {
           this.autonomia = autonomia;   
        }
         
     
    }

    public int getNumTotalFileiras() {
        return numTotalFileiras;
    }

    public void setNumTotalFileiras(int numTotalFileiras) throws Exception {
        
        if(numTotalFileiras<=0)
        {
            throw new Exception("Campo Numero Total de Fileiras nulo! Digite novamente.");
        }
        else
        {
           this.numTotalFileiras = numTotalFileiras; 
        }
      
        
    }

    public int getNumAssentosPorFileira() {
        return numAssentosPorFileira;
    }

    public void setNumAssentosPorFileira(int numAssentosPorFileira) throws Exception {
        
        
        if(numAssentosPorFileira<=0)
        {
            throw new Exception("Numero de Assentos por Fileira nao pode ser menor ou igual a 0!");
        }
        else
        {
            this.numAssentosPorFileira = numAssentosPorFileira;
        }
        
    }

    public int getNumFileirasExecutiva() {
        return numFileirasExecutiva;
    }

    public void setNumFileirasExecutiva(int numFileirasExecutiva) throws Exception {
        
        if(numFileirasExecutiva<=0)
        {
            throw new Exception("Numero de Fileiras Executivas invalido!");
        }
        else if(getNumTotalFileiras() <= numFileirasExecutiva  )
        {
            throw new Exception("Numero de fileiras executivas ultrapassando numero total de fileiras!");
        }
        else
        {
            this.numFileirasExecutiva = numFileirasExecutiva;
        }
        
        
    }

    public int getNumFileirasEconomica() {
        return numFileirasEconomica;
    }

    public void setNumFileirasEconomica(int numFileirasEconomica) throws Exception {
        
        
        if(numFileirasEconomica <= 0)
        {
            throw new Exception("Numero de Fileiras Economicas invalido!");
        }
        else if(getNumTotalFileiras() <= numFileirasEconomica )
        {
            throw new Exception("Numero de fileiras economicas ultrapassando numero total de fileiras!");
        }
        else
        {
            this.numFileirasEconomica = numFileirasEconomica;
        }
            
    }
       
    public void removeVoo(int codVoo){
        //Removendo do ArrayList
        for (Voo v: AvooAeronave) {
           if(v.getCodigoIdentificador() == codVoo){
               AvooAeronave.remove(v);
           }
        }
        
        //Removendo do Hashtable
        HvooAeronave.remove(codVoo);
        
    }
    
    public void escrever(Aeronave dados) throws Exception
    {
        try
        {
            File arquivo = new File("Aeronave/"+"aeronave_"+prefixoIdentificador+".ser");
            if(arquivo.exists()){
                throw new Exception("Aeronave já existente!");
            }
            else{
            ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("Aeronave/"+"aeronave_"+prefixoIdentificador+".ser"));
            
            saida.writeObject(dados);
            }
            
        }catch(IOException ioException)
        {
            System.err.println("Erro");
        }
    }
    
    
    
    public Aeronave ler(String prefixoIdentificador) throws Exception
    {
        Aeronave dados = new Aeronave();
        try
        {
            
            ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("Aeronave/"+"aeronave_"+prefixoIdentificador+".ser"));
             
            dados = (Aeronave) entrada.readObject(); 
            
            
            
            
        }catch(IOException ioException)
        {
            System.err.println(ioException.getMessage());
       
         } catch (ClassNotFoundException ex) {
            Logger.getLogger(Aeronave.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
           return dados; 
        }
    
    }
    
    public void remover(String prefixoIdentificador)
    {
        try
        {
            
           File file = new File("Aeronave/"+"aeronave_"+prefixoIdentificador+".ser");
           
           if(file.delete())
           {
               JOptionPane.showMessageDialog(null, "Arquivo deletado com sucesso!");
           }
           else
           {
               JOptionPane.showMessageDialog(null, "Problemas ao deletar o arquivo.");
           }
           
            
            
        }catch(Exception e)
        {
            System.err.println(e.getMessage());
        }
    }
    
    public void alterar(Aeronave dados) throws Exception{
        
        try{
        ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("Aeronave/"+"aeronave_"+dados.getPrefixoIdentificador()+".ser"));
        saida.writeObject(dados);
        }catch(Exception e){
            throw new Exception("Erro ao Alterar!");
        }
            
        
    }
    
    public ArrayList<Aeronave> listaAeronaves(final File folder) {
        ArrayList<Aeronave> nave = new ArrayList<>();
       
        for ( File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            
            listaAeronaves(fileEntry);
        } else {
            try {
                ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("Aeronave/"+fileEntry.getName().toString()));
                
                
                
                nave.add((Aeronave) entrada.readObject());
                             
                
            } catch (    IOException | ClassNotFoundException ex) {
                System.err.println(ex.getMessage());
                // Logger.getLogger(FaturamentoSerialize.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            
        }
    }
   
   return nave;
  }
    
    
}
